package org.pps.gl.server.datastore;


import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import com.google.appengine.api.datastore.Entity;

/**
 * Cette classe prend en charge toutes les operations
 * en rapport avec l'entitée EventLogger.
 * Elle permet d'avoir la liste des 20 derniers evenemments du profil.
 * 
 * Un Event_logger a les propriétés suivantes : 
 * 		- date
 * 		- event_information
 * 		- event_user_mail
 * 		- event_User (autant qu'il y a d'intervenant pour l'evenement
 * 
 */
public class EventLogger{
	
	public static final String EVENT_LOGGER_KIND = "event_Logger";
	public static final String EVENT_LOGGER_DATE= "date";
	public static final String EVENT_LOGGER_TYPE= "event_type";
	public static final String EVENT_LOGGER_INVOLVED_USER_KIND= "event_involved_users";
//	public static final String EVENT_LOGGER_USER_MAIL= "user_mail";
	public static final String EVENT_LOGGER_OWNER_MAIL= "owner_mail";
	public static final String EVENT_LOGGER_NUMBER= "event_number";
	public static final int EVENT_MODIFY_ETUDE = 1;
	public static final int EVENT_MODIFY_EXPERIENCE = 2;
	public static final int EVENT_CREATE_PROFILE= 3;
	public static final int EVENT_ADD_CONTACT = 4;
	public static final int EVENT_MODIFY_USER_INFORMATION = 5;

	
	
	
//	public static enum EventType{
//		modifyEtude,
//		modifyEntreprise,
//		modifyEcole,
//		addContact,
//		suppresContact,
//		modifyUserInformation,
//		createProfile
//	};
	
	
	
	
	/**
	 * 
	 * Créer une nouvelle experience pour un utilisateur.
	 * @param emailUser : email de l'utilisateur concerné.
	 * @param periode : Période de temps pour cette expérience pro.
	 * @return la nouvelle entitée crée.
	 */
	public static Entity createEventLogger(Entity user, Date date,  int type, ArrayList<String> usersEmail){
		Iterator<Entity> it = Util.listChildren(EVENT_LOGGER_KIND, user.getKey()).iterator();
		int nb = 0;
		//on compte le nombre d'evenemment
		while(it.hasNext()){
			nb++;
			it.next();
		}
		//si le nombre d'evenemments est plus grand que 20 on enleve le plus vieux 
		//et on augmente le numéro de tous les aurtres evenmments.
		if(nb >= 20){
			it = Util.listChildren(EVENT_LOGGER_KIND, user.getKey()).iterator();
			int max = 0;
			Entity oldestEvent = null;
			while(it.hasNext()){
				Entity tmp = it.next();
				int tmpNumber = (Integer) tmp.getProperty(EVENT_LOGGER_NUMBER) +1;
				tmp.setProperty(EVENT_LOGGER_NUMBER, tmpNumber);
				if(tmpNumber > max){
					max = tmpNumber;
					oldestEvent = tmp;
				}
			}
			if(oldestEvent != null){
				Util.deleteEntity(oldestEvent.getKey());
			}
			
		}
		String ownerMail = (String) user.getKey().getName();
		//insertion d'un évènemment
		Entity event = new Entity(EVENT_LOGGER_KIND,user.getKey());
		event.setProperty(EVENT_LOGGER_DATE, date);
		event.setProperty(EVENT_LOGGER_TYPE, type);
		event.setProperty(EVENT_LOGGER_NUMBER, 1);
		event.setProperty(EVENT_LOGGER_OWNER_MAIL, ownerMail);
		event.setProperty(EVENT_LOGGER_INVOLVED_USER_KIND, usersEmail);
//		for(String userEmail : usersEmail){
//			Entity involvedUser = new Entity(EVENT_LOGGER_INVOLVED_USER_KIND, event.getKey());
//			involvedUser.setProperty(EVENT_LOGGER_USER_MAIL, userEmail);
//			event.setUnindexedProperty(EVENT_LOGGER_INVOLVED_USER_KIND, involvedUser.getKey());
//			Util.persistEntity(involvedUser);
//		}
		Util.persistEntity(event);
		return event;
	}




	/**
	 * Récupère tout les évènements d'un user.
	 * 
	 * @param profil
	 *          : profil de l'user
	 * @return: toutes les etudes du type user
	 */
	public static Iterable<Entity> listUserEvents(Entity user) {
		return Util.listChildren(EVENT_LOGGER_KIND, user.getKey());
	}
	
	
	/**
	 * Récupère la date pour une entité EventLogger.
	 * 
	 * @param EventLogger
	 * @return
	 */
	public static Date getDate(Entity eventLogger) {
		return (Date) eventLogger.getProperty(EVENT_LOGGER_DATE);
	}
	
	
	/**
	 * récupère le tye de l'evenemment de eventLogger
	 * @param eventLogger
	 * @return
	 */
	public static int getType(Entity eventLogger){
		return Math.round((float) Math.floor((Long) eventLogger.getProperty(EVENT_LOGGER_TYPE)));
	}


	/**
	 * récupère le numéros de l'evenement
	 * @param eventLogger
	 * @return
	 */
	public static int getNumber(Entity eventLogger){
		return Math.round((float) Math.floor((Long) eventLogger.getProperty(EVENT_LOGGER_NUMBER)));
	}
	
	
	
	/**
	 * récupère le mail du propriétaire de l'evenement
	 * @param eventLogger
	 * @return
	 */
	public static String getOwnerMail(Entity eventLogger){
		return (String)eventLogger.getProperty(EVENT_LOGGER_OWNER_MAIL);
	}
	
/**
 * Récupère l'ensemble des mails des users impliqués dans l'évènement
 * @param eventLogger
 * @return
 */
	@SuppressWarnings("unchecked")
	public static ArrayList<String> listInvolvedUsersMail(Entity eventLogger){
//		ArrayList<String> involvedUsersMail = new ArrayList<String>();
//		Iterator<Entity> it = Util.listChildren(EventLogger.EVENT_LOGGER_INVOLVED_USER_KIND, eventLogger.getKey()).iterator();
//		while(it.hasNext()){
//			involvedUsersMail.add((String)it.next().getProperty(EVENT_LOGGER_USER_MAIL));
//		}
		return (ArrayList<String>) eventLogger.getProperty(EVENT_LOGGER_INVOLVED_USER_KIND);//involvedUsersMail;
	}
}
